package com.css.dzj.dzjap.modules.apunit.service.impl;

import com.css.dzj.dzjap.common.util.Constant;
import com.css.dzj.dzjap.modules.apunit.entity.ApUnitEntity;
import com.css.dzj.dzjap.modules.apunit.entity.QApUnitEntity;
import com.css.dzj.dzjap.modules.apunit.mapper.ApunitMapper;
import com.css.dzj.dzjap.modules.apunit.service.ApunitService;
import com.css.dzj.dzjap.modules.enterprise.service.EnterpriseService;
import com.css.dzj.dzjap.modules.todolist.entity.ApTodoEntity;
import com.css.dzj.dzjap.modules.todolist.mapper.ApTodoMapper;
import com.querydsl.core.QueryResults;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * 评价单位service
 */
@Service
public class ApunitServiceImpl implements ApunitService {

    @Autowired
    private ApunitMapper apunitMapper;

    @Autowired
    private ApTodoMapper apTodoMapper;

    @Autowired
    private JPAQueryFactory jpaQueryFactory;
    @Autowired
    private EnterpriseService enterpriseService;

    /**
     * 评价单位注册
     * @param apUnitEntity
     */
    @Transactional
    @Override
    public void regist(ApUnitEntity apUnitEntity) {
        try{
            apUnitEntity.setPassword(apUnitEntity.getPassword());
            apUnitEntity.setSpStatus(Constant.CHECK_STATUS1);
            apUnitEntity.setSbStatus(Constant.REPORT_STATUS_NO);
            apUnitEntity.setDelFlag(Constant.NO_DELETE);
            apUnitEntity.setCreateTime(new Date());
            apUnitEntity.setCreatePerson("");
            apUnitEntity.setId(UUID.randomUUID().toString());
            ApTodoEntity todoEntity = new ApTodoEntity();
            todoEntity.setTitle(apUnitEntity.getUnitName()+"安评单位审核");
            todoEntity.setCreateTime(new Date());
            todoEntity.setLocation(apUnitEntity.getRegistAddr().split("-")[0]);
            todoEntity.setDelFlag(Constant.NO_DELETE);
            todoEntity.setStatus(Constant.STATUSDB);
            todoEntity.setTypeFlag(Constant.TYPRFLAGSS);
            todoEntity.setUrl("../todolist/apunit.html");
            todoEntity.setLinkId(apUnitEntity.getId());
            todoEntity.setStation("安评单位审核员");
            apunitMapper.save(apUnitEntity);
            apTodoMapper.save(todoEntity);
        } catch(Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 判断用户名是否存在
     * @param userName
     * @return
     */
    @Override
    public boolean isExistUserName(String userName) {
        try {
            QApUnitEntity qApUnitEntity = QApUnitEntity.apUnitEntity;
            ApUnitEntity count=jpaQueryFactory.selectFrom(qApUnitEntity).where(qApUnitEntity.userName.eq(userName),
                    qApUnitEntity.delFlag.eq(Constant.NO_DELETE),
                    qApUnitEntity.spStatus.ne(Constant.CHECK_STATUS2)).fetchOne();
            if(count != null) {
                return true;
            }
            return false;
        } catch(Exception e) {
            e.printStackTrace();
            return true;
        }

    }

    /**
     * 判断统一社会信用代码是否存在
     * @param uniSCID
     * @return
     */
    @Override
    public boolean isExistEntCode(String uniSCID) {
        try {
            QApUnitEntity qApUnitEntity = QApUnitEntity.apUnitEntity;
            List<ApUnitEntity> list =jpaQueryFactory.selectFrom(qApUnitEntity).where(qApUnitEntity.uniscid.eq(uniSCID),
                    qApUnitEntity.delFlag.eq(Constant.NO_DELETE), qApUnitEntity.spStatus.ne(Constant.CHECK_STATUS2)).fetch();
            if(list != null && list.size() > 0) {
                return true;
            }
            return false;
        } catch(Exception e) {
            e.printStackTrace();
            return true;
        }
    }

    @Override
    public QueryResults<ApUnitEntity> queryByTel(Pageable pageable, String mobile) {
        try{
            QApUnitEntity qApUnitEntity = QApUnitEntity.apUnitEntity;
            QueryResults<ApUnitEntity> apUnitEntityList =  jpaQueryFactory.selectFrom(qApUnitEntity).where(qApUnitEntity.linkTel.eq(mobile),
                    qApUnitEntity.delFlag.eq(Constant.NO_DELETE))
                    .orderBy(qApUnitEntity.createTime.desc())
                    .offset(pageable.getOffset())
                    .limit(pageable.getPageSize())
                    .fetchResults();

            return apUnitEntityList;
        } catch(Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    /**
     * 通过id查询安评单位
     * @param id
     * @return
     */
    @Override
    public ApUnitEntity queryById(String id) {
        try {
            ApUnitEntity apUnitEntity = apunitMapper.findById(id).get();
            return apUnitEntity;
        } catch(Exception e) {
            e.printStackTrace();
            return null;
        }

    }


    @Override
    public List<ApUnitEntity> queryByApLevel(String apLevel) {
        try{
            QApUnitEntity qApUnitEntity = QApUnitEntity.apUnitEntity;
            List<ApUnitEntity> apUnitEntityList =  jpaQueryFactory.selectFrom(qApUnitEntity).where(qApUnitEntity.apLevel.eq(apLevel),
                    qApUnitEntity.delFlag.eq(Constant.NO_DELETE),qApUnitEntity.spStatus.eq("1")).fetch();

            return apUnitEntityList;
        } catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 通过地址查询安评单位
     * @param location
     * @return
     */
    @Override
    public List<ApUnitEntity> queryByLocation(String location) {
        try {
            List idNumber=enterpriseService.idNumber();
            QApUnitEntity qApUnitEntity  = QApUnitEntity.apUnitEntity;
            List<ApUnitEntity> apUnitEntityList = new ArrayList<>();
            if (Constant.LOCATIONZG.contains(location)){
                apUnitEntityList = jpaQueryFactory.selectFrom(qApUnitEntity).where(qApUnitEntity.spStatus.eq(Constant.CHECK_STATUS3), qApUnitEntity.delFlag.eq(Constant.NO_DELETE),qApUnitEntity.uniscid.notIn(idNumber)).fetch();
            }else {
                apUnitEntityList = jpaQueryFactory.selectFrom(qApUnitEntity).where(qApUnitEntity.registAddr.like("%"+location+"%"),
                        qApUnitEntity.spStatus.eq(Constant.CHECK_STATUS3), qApUnitEntity.delFlag.eq(Constant.NO_DELETE),qApUnitEntity.uniscid.notIn(idNumber)).fetch();
            }
            return apUnitEntityList;
        } catch(Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    /**
     * 查询上报给中国地震局的安评单位
     * @return
     */
    @Override
    public List<ApUnitEntity> querySbUnit() {
        try {
            QApUnitEntity qApUnitEntity = QApUnitEntity.apUnitEntity;
            List<ApUnitEntity> apUnitEntityList = jpaQueryFactory.selectFrom(qApUnitEntity).where(qApUnitEntity.spStatus.eq(Constant.CHECK_STATUS3),
                    qApUnitEntity.sbStatus.eq(Constant.REPORT_STATUS_YES), qApUnitEntity.delFlag.eq(Constant.NO_DELETE)).fetch();
            return apUnitEntityList;

        } catch(Exception e) {
            e.printStackTrace();
            return null;
        }

    }
}
